package com.atguigu.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

public class HdfsClient {

    private FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        // 连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        // 创建一个配置文件
        Configuration configuration = new Configuration();

        // 修改副本数
        configuration.set("dfs.replication","2");
        // 用户
        String user = "zeng";
        // 获取到客户端对象
        fs = FileSystem.get(uri, configuration, user);
    }

    @After
    public void close() throws IOException {
        // 关闭资源
        fs.close();
    }
    @Test
    public void testmkdir() throws IOException{


        // 创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan1"));
    }

    // 上传
    /**
     * 配置文件优先级 hdfs-default.xml < hdfs-site.xml < 项目资源目录下的配置文件 < 代码里面的配置文件
     * */
    @Test
    public void testPut() throws IOException {
        /**
         * 参数1表示删除原数据
         * 2是否允许覆盖
         * 3原数据路径
         * 4目的地路径
         * */
        fs.copyFromLocalFile(false,true,new Path("D:\\sunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huaguoshan"));
    }

    // 文件下载
    @Test
    public void testGet() throws IOException {
        /**
         * 参数1原文件是否删除
         * 2原文件路径HDFS
         * 3目标地址路径win
         * 4是否校验
         * */
        fs.copyToLocalFile(false,new Path("hdfs://hadoop102/xiyou/huaguoshan"),new Path("D:\\sunwukong.txt"),false);
    }

    // 文件删除
    @Test
    public void testRm() throws IOException {
        // 参数1要删除的路径，2是否递归删除
        fs.delete(new Path("/input"),true);
    }

    // 文件改名和移动
    @Test
    public void testmv() throws IOException {
        /**
         * 参数1原文件路径
         * 2目标文件路径
         * */
        fs.rename(new Path("/jinguo/weiguo.txt"),new Path("/jinguo/wei.txt"));
    }

    // 获取文件详情信息
    @Test
    public void testDetail() throws IOException {
        // 获取所以文件信息
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("======"+fileStatus.getPath()+"=======");
            System.out.println(fileStatus.getPermission()); //获取权限
            System.out.println(fileStatus.getOwner()); //获取所属用户
            System.out.println(fileStatus.getGroup()); //获取属组
            System.out.println(fileStatus.getLen()); // 获取具体大小
            System.out.println(fileStatus.getModificationTime()); //获取创建时间
            System.out.println(fileStatus.getReplication()); //获取副本个数
            System.out.println(fileStatus.getBlockSize()); //获取块大小
            System.out.println(fileStatus.getPath().getName()); //获取文件名

            // 获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();

            System.out.println(Arrays.toString(blockLocations));
        }
    }

    // 判断是文件还是目录
    @Test
    public void testFile() throws IOException {
        FileStatus[] listStatus = fs.listStatus(new Path("/"));

        for (FileStatus status : listStatus) {
            if (status.isFile()) { //判断是否是文件
                System.out.println("文件："+status.getPath().getName());
            }else {
                System.out.println("目录："+status.getPath().getName());
            }
        }
    }
}
